Daily trade alerts for TRX

Mark Ziemann https://mdz-analytics.com

2022-09-26

Source code

Intro

In the backtesting analysis, I have established several different profitable strategies for timing entry/exits. Visit the TRX page to see how these signals were identified.

  1. Simple moving average (SMA)

  2. Exponential moving average (EMA)

  3. SMA crosses

  4. EMA crosses

  5. Directional movement index (DMI)

  6. True strength index (TSI) BEST

  7. Stochastic oscillator (stoch)

  8. Double RSI

  9. Donchian channel

  10. Ensembl indicator

This script will examine the price action and these trade signals just before the daily close. If the signal is TRUE, it is bullish and if FALSE it is bearish. When there is a switch from bearish to bullish it is a buy signal and when it switches from bullish to bearish it is a sell signal. This HTML is updated just before the daily close each day, but push notifications for any trade signals are also sent by push bullet.

To receive these signals in real-time, subscribe to the following channels - it’s free for a limited time!

https://www.pushbullet.com/channel?tag=trx_signal

If you need some help to design your own trading signals/strategies, I am happy to help for a fee. email me at mark.ziemann{αt}gmail.com for any enquiries/suggestions/feedback.

This report is distributed for FREE under the MIT licence, but if you find it useful, consider a small tip.

Monero Address

Reminder: this analysis is not financial advice.

suppressPackageStartupMessages({
  library("jsonlite")
  library("tidyverse")
  library("runner")
  library("quantmod")
  library("TTR")
  library("RPushbullet")
  library("kableExtra")
})

TESTING = FALSE

MYNOTE = NULL
mydate <- Sys.time()
attr(mydate, "tzone") <- "UTC"
mydate <- as.Date(mydate)

Get TRX parameters

params <- read.table("https://mdz-analytics.com/coins/TRX/TRX_dat.txt", header=TRUE)
params %>% kbl(caption="optimised backtested parameters") %>%  kable_styling("hover", full_width = F)
optimised backtested parameters
indicator parameter meanROI totalROI ntrades ndays xhodl
SMA 4 1.080741 202.69864 252 1819 6.608280
EMA 41 1.334405 54.69689 79 1819 1.783201
SMAcross 26,22 1.631558 231.49573 53 1819 7.547108
EMAcross 42,6 1.913966 111.06762 27 1819 3.620971
DMI 4 1.135638 48.12371 139 1819 1.568905
DC 3 1.133359 157.44667 167 1819 5.132998
TSI 16,3,3 1.109502 624.95840 192 1819 20.374582
stoch 12,6,1 1.084759 1561.45891 232 1819 50.905905
RSI2 4,23 1.077892 681.00992 270 1819 22.201946
Ensemble SMAcross,TSI,stoch,3 1.172332 1912.68676 111 1819 76.563299

Get TRX price data

Obtaining TRX price data (daily) for the last 300 days and today’s price.

URL="https://web-api.coinmarketcap.com/v1/cryptocurrency/ohlcv/historical?symbol=TRX&convert=USD&interval=daily&count=300"
download.file(URL,destfile="trxdat.txt")
trxdat <- fromJSON("trxdat.txt")
price <- trxdat$data$quotes
price <- data.frame(  as.Date(price$time_close) , price$quote$USD$high, price$quote$USD$low, price$quote$USD$close)
colnames(price) <- c("date","high","low","close")

URL="https://web-api.coinmarketcap.com/v1/cryptocurrency/ohlcv/historical?symbol=TRX&convert=USD&interval=hourly&time_period=hourly&count=11"
download.file(URL,destfile="trxdat.txt")
trxdat <- fromJSON("trxdat.txt")
price2 <- trxdat$data$quotes
price2 <- data.frame( as.Date(price2$time_close) , price2$quote$USD$high, price2$quote$USD$low, price2$quote$USD$close,stringsAsFactors=FALSE)
colnames(price2) <- c("date","high","low","close")

high <- max(price2[,2])
low <-  min(price2[,3])
close <- price2[nrow(price2),4]

df <- data.frame(date=mydate,high=high,low=low,close=close,stringsAsFactors=FALSE)
price <- rbind(price,df)
tail(price) %>% kbl(row.names = FALSE) %>% kable_styling("hover", full_width = F)
date high low close
2022-09-21 0.0611722 0.0588482 0.0591937
2022-09-22 0.0603352 0.0588364 0.0602601
2022-09-23 0.0611151 0.0593600 0.0604473
2022-09-24 0.0608608 0.0596805 0.0598714
2022-09-25 0.0602690 0.0595288 0.0597274
2022-09-26 0.0598475 0.0593026 0.0594387
if ( TESTING == TRUE) {
  price[nrow(price),"Close"] <- price[nrow(price),"Close"] * 2
}

TRX SMA indicator

Now to determine whether TRX has crossed the SMA line.

price2 <- price

n <- as.numeric(params[params$indicator == "SMA",2])

price2$ma <- SMA(Cl(price2),n=n)
price2$signal <- price2$close > price2$ma
tail(price2) %>% kbl(row.names = FALSE) %>% kable_styling("hover", full_width = F)
date high low close ma signal
2022-09-21 0.0611722 0.0588482 0.0591937 0.0600382 FALSE
2022-09-22 0.0603352 0.0588364 0.0602601 0.0598844 TRUE
2022-09-23 0.0611151 0.0593600 0.0604473 0.0599124 TRUE
2022-09-24 0.0608608 0.0596805 0.0598714 0.0599431 FALSE
2022-09-25 0.0602690 0.0595288 0.0597274 0.0600766 FALSE
2022-09-26 0.0598475 0.0593026 0.0594387 0.0598712 FALSE
today_signal <- price2[nrow(price2),"signal"]
previous_signal <- price2[(nrow(price2)-1),"signal"]
if (today_signal != previous_signal ) {
  if ( (today_signal == TRUE ) & (previous_signal == FALSE ) ) {
    trx_signal="BUY"
  }
  if ( (today_signal == FALSE ) & (previous_signal == TRUE ) ) {
    trx_signal="SELL"
  }
} else {
trx_signal <- "NONE"
}

if (today_signal==TRUE) {
  ens_SMA=TRUE
} else {
  ens_SMA=FALSE
}

message(paste("TRX SMA signal:",trx_signal))
## TRX SMA signal: NONE
plot(price2$close~as.Date(price2$date),type="l",
  xlab="Date",ylab="price (USD)",main="TRX w SMA")
grid()
lines(price2$ma~ as.Date(price2$date) ,col="red")

if ( trx_signal != "NONE") {
  MYNOTE <- paste("The TRX SMA signal is", trx_signal,".")
}

TRX EMA indicator

Now to determine whether TRX has crossed the EMA line.

price2 <- price

n <- as.numeric(params[params$indicator == "EMA",2])

price2$ma <- EMA(Cl(price2),n=n)
price2$signal <- price2$close > price2$ma
tail(price2) %>% kbl(row.names = FALSE) %>%  kable_styling("hover", full_width = F)
date high low close ma signal
2022-09-21 0.0611722 0.0588482 0.0591937 0.0634917 FALSE
2022-09-22 0.0603352 0.0588364 0.0602601 0.0633378 FALSE
2022-09-23 0.0611151 0.0593600 0.0604473 0.0632001 FALSE
2022-09-24 0.0608608 0.0596805 0.0598714 0.0630416 FALSE
2022-09-25 0.0602690 0.0595288 0.0597274 0.0628838 FALSE
2022-09-26 0.0598475 0.0593026 0.0594387 0.0627198 FALSE
today_signal <- price2[nrow(price2),"signal"]
previous_signal <- price2[(nrow(price2)-1),"signal"]
if (today_signal != previous_signal ) {
  if ( (today_signal == TRUE ) & (previous_signal == FALSE ) ) {
    trx_signal="BUY"
  }
  if ( (today_signal == FALSE ) & (previous_signal == TRUE ) ) {
    trx_signal="SELL"
  }
} else {
  trx_signal <- "NONE"
}

if (today_signal==TRUE) {
  ens_EMA=TRUE
} else {
  ens_EMA=FALSE
}

message(paste("TRX EMA signal:",trx_signal))
## TRX EMA signal: NONE
plot(price2$close~as.Date(price2$date),type="l",
  xlab="Date",ylab="price (USD)",main="TRX EMA")
grid()
lines(price2$ma~ as.Date(price2$date) ,col="red")

if ( trx_signal != "NONE") {
  MYNOTE <- paste("The TRX EMA signal is", trx_signal,".")
}

TRX SMA cross indicator

The SMA cross is a reasonably good strategy.

price2 <- price

n <- as.numeric(unlist(strsplit(params[params$indicator == "SMAcross",2],",")))
n1 <- n[1]
n2 <- n[2]

price2$ma1 <- SMA(Cl(price2),n=n1)
price2$ma2 <- SMA(Cl(price2),n=n2)

price2$signal <- price2$ma2 > price2$ma1
tail(price2) %>% kbl(row.names = FALSE) %>% kable_styling("hover", full_width = F)
date high low close ma1 ma2 signal
2022-09-21 0.0611722 0.0588482 0.0591937 0.0622605 0.0621065 FALSE
2022-09-22 0.0603352 0.0588364 0.0602601 0.0621589 0.0619635 FALSE
2022-09-23 0.0611151 0.0593600 0.0604473 0.0621195 0.0618361 FALSE
2022-09-24 0.0608608 0.0596805 0.0598714 0.0619853 0.0617123 FALSE
2022-09-25 0.0602690 0.0595288 0.0597274 0.0617942 0.0615585 FALSE
2022-09-26 0.0598475 0.0593026 0.0594387 0.0616416 0.0613730 FALSE
today_signal <- price2[nrow(price2),"signal"]
previous_signal <- price2[(nrow(price2)-1),"signal"]
if (today_signal != previous_signal ) {
  if ( (today_signal == TRUE ) & (previous_signal == FALSE ) ) {
    trx_signal="BUY"
  }
  if ( (today_signal == FALSE ) & (previous_signal == TRUE ) ) {
    trx_signal="SELL"
  }
} else {
trx_signal <- "NONE"
}

if (today_signal==TRUE) {
  ens_SMAcross=TRUE
} else {
  ens_SMAcross=FALSE
}

message(paste("TRX SMA cross signal:",trx_signal))
## TRX SMA cross signal: NONE
plot(price2$close~as.Date(price2$date),type="l",
  xlab="Date",ylab="price (USD)",main="TRX w SMA cross")
grid()
lines(price2$ma1~ as.Date(price2$date) ,col="red")
lines(price2$ma2~ as.Date(price2$date) ,col="blue")

if ( trx_signal != "NONE") {
  MYNOTE <- paste(MYNOTE, "The TRX SMA cross signal is", trx_signal,".")
}

TRX EMA cross indicator

The EMA cross is a moderately profitable strategy.

price2 <- price

n <- as.numeric(unlist(strsplit(params[params$indicator == "EMAcross",2],",")))
n1 <- n[1]
n2 <- n[2]

price2$ma1 <- EMA(Cl(price2),n=n1)
price2$ma2 <- EMA(Cl(price2),n=n2)

price2$signal <- price2$ma2 > price2$ma1
tail(price2) %>% kbl(row.names = FALSE) %>%  kable_styling("hover", full_width = F)
date high low close ma1 ma2 signal
2022-09-21 0.0611722 0.0588482 0.0591937 0.0635531 0.0603781 FALSE
2022-09-22 0.0603352 0.0588364 0.0602601 0.0633999 0.0603444 FALSE
2022-09-23 0.0611151 0.0593600 0.0604473 0.0632626 0.0603738 FALSE
2022-09-24 0.0608608 0.0596805 0.0598714 0.0631049 0.0602303 FALSE
2022-09-25 0.0602690 0.0595288 0.0597274 0.0629478 0.0600866 FALSE
2022-09-26 0.0598475 0.0593026 0.0594387 0.0627846 0.0599015 FALSE
today_signal <- price2[nrow(price2),"signal"]
previous_signal <- price2[(nrow(price2)-1),"signal"]
if (today_signal != previous_signal ) {
  if ( (today_signal == TRUE ) & (previous_signal == FALSE ) ) {
    trx_signal="BUY"
  }
  if ( (today_signal == FALSE ) & (previous_signal == TRUE ) ) {
    trx_signal="SELL"
  }
} else {
  trx_signal <- "NONE"
}

if (today_signal==TRUE) {
  ens_EMAcross=TRUE
} else {
  ens_EMAcross=FALSE
}

message(paste("TRX EMA cross signal is",trx_signal))
## TRX EMA cross signal is NONE
plot(price2$close~as.Date(price2$date),type="l",
  xlab="Date",ylab="price (USD)",main="TRX EMA cross")
grid()
lines(price2$ma1~ as.Date(price2$date) ,col="red")
lines(price2$ma2~ as.Date(price2$date) ,col="blue")

if ( trx_signal != "NONE") {
  MYNOTE <- paste(MYNOTE, "The TRX EMA cross signal is", trx_signal,".")
}

TRX DMI indicator

Directional movement indicator is a good approach to identify trend changes.

n <- as.numeric(params[params$indicator == "DMI",2])

dmi.adx <- ADX(price[,c("high","low","close")],n=n)
price2 <- cbind(price,dmi.adx)
price2$signal <- dmi.adx[,1] > dmi.adx[,2]
tail(price2) %>% kbl(row.names = FALSE) %>% kable_styling("hover", full_width = F)
date high low close DIp DIn DX ADX signal
2022-09-21 0.0611722 0.0588482 0.0591937 5.916605 30.56356 67.56262 46.15816 FALSE
2022-09-22 0.0603352 0.0588364 0.0602601 4.532070 23.59572 67.77514 51.56241 FALSE
2022-09-23 0.0611151 0.0593600 0.0604473 15.209860 17.28168 6.37649 40.26593 FALSE
2022-09-24 0.0608608 0.0596805 0.0598714 12.266844 13.93778 6.37649 31.79357 FALSE
2022-09-25 0.0602690 0.0595288 0.0597274 10.558400 14.85265 16.89914 28.06996 FALSE
2022-09-26 0.0598475 0.0593026 0.0594387 9.288638 18.05842 32.06846 29.06959 FALSE
today_signal <- price2[nrow(price2),"signal"]
previous_signal <- price2[(nrow(price2)-1),"signal"]
if (today_signal != previous_signal ) {
  if ( (today_signal == TRUE ) & (previous_signal == FALSE ) ) {
    trx_signal="BUY"
  }
  if ( (today_signal == FALSE ) & (previous_signal == TRUE ) ) {
    trx_signal="SELL"
  }
} else {
  trx_signal <- "NONE"
}

if (today_signal==TRUE) {
  ens_DMI=TRUE
} else {
  ens_DMI=FALSE
}

message(paste("TRX DMI signal:",trx_signal))
## TRX DMI signal: NONE
price2 <- as.data.frame(price2)
par(mfrow=c(2,1))
plot(price2$close~as.Date(price2$date),type="l",
  xlab="Date",ylab="price (USD)",main="TRX USD price")
grid()
plot(price2$DIp~as.Date(price2$date),type="l", col="blue",
  xlab="Date",ylab="price (USD)",main="TRX DMI")
grid()
lines(price2$DIn ~ as.Date(price2$date) ,col="red")

if ( trx_signal != "NONE") {
  MYNOTE <- paste(MYNOTE,"TRX DMI signal is", trx_signal,".")
}

TRX TSI indicator

True Strength Indicator is one of the more profitable approaches. Its success lies in how it changes rapidly when momentum shifts. For most coins, this indicator performs “best” in backtesting analysis, which means it should carry relatively more weight than other indicators.

n <- as.numeric(unlist(strsplit(params[params$indicator == "TSI",2],",")))
n1 <- n[1]
n2 <- n[2]
ns <- n[3]

TSI <- function(x, n.first = 25, n.second = 13, n.signal = 7) {
  #True Strength Indicator
  #https://school.stockcharts.com/doku.php?id=technical_indicators:true_strength_index
  x <- try.xts(x, error = as.matrix)
  pc <- x - lag.xts(x, na.pad = T) #force lag.xts to get na padding
  dspc <- EMA(EMA(pc, n = n.first), n = n.second)
  dsapc <- EMA(EMA(abs(pc), n = n.first), n = n.second)

  tsi <- 100 * (dspc/dsapc)
  signal <- EMA(tsi, n = n.signal)
  r <- cbind(tsi, signal)
  r <- reclass(r, x)
  if (!is.null(dim(r))) colnames(r) <- c("tsi", "signal")
  return(r)
}

tsi <- TSI(price$close , n.first = n1, n.second = n2, n.signal = ns )
colnames(tsi) <- c("tsi","sig")

price2 <- cbind(price,tsi)
price2$signal <- tsi[,1] > tsi[,2]
tail(price2) %>% kbl(row.names = FALSE) %>% kable_styling("hover", full_width = F)
date high low close tsi sig signal
2022-09-21 0.0611722 0.0588482 0.0591937 -31.34615 -26.69396 FALSE
2022-09-22 0.0603352 0.0588364 0.0602601 -24.41839 -25.55618 TRUE
2022-09-23 0.0611151 0.0593600 0.0604473 -19.55598 -22.55608 TRUE
2022-09-24 0.0608608 0.0596805 0.0598714 -20.58277 -21.56942 TRUE
2022-09-25 0.0602690 0.0595288 0.0597274 -21.98370 -21.77656 FALSE
2022-09-26 0.0598475 0.0593026 0.0594387 -24.58485 -23.18071 FALSE
today_signal <- price2[nrow(price2),"signal"]
previous_signal <- price2[(nrow(price2)-1),"signal"]
if (today_signal != previous_signal ) {
  if ( (today_signal == TRUE ) & (previous_signal == FALSE ) ) {
    trx_signal="BUY"
  }
  if ( (today_signal == FALSE ) & (previous_signal == TRUE ) ) {
    trx_signal="SELL"
  }
} else {
  trx_signal <- "NONE"
}

if (today_signal==TRUE) {
  ens_TSI=TRUE
} else {
  ens_TSI=FALSE
}

message(paste("TRX TSI signal:",trx_signal))
## TRX TSI signal: NONE
par(mfrow=c(2,1))
plot(price2$close ~ as.Date(price2$date),type="l",log="y",
  xlab="Date",ylab="price (USD)",main="USD price")
grid()

plot(tsi[,1] ~ as.Date(price2$date),type="l",col="blue",
  xlab="Date",ylab="TSI",main="TSI")
lines(as.Date(price2$date), tsi[,2]  , col="red"  )
grid()

par(mfrow=c(1,1))
if ( trx_signal != "NONE") {
  MYNOTE <- paste(MYNOTE,"TRX TSI signal is", trx_signal,".")
}

TRX stochastic oscillator indicator

Similar to the TSI, the stoch can pinpoint early changes in momentum, however it may give many false positives.

n <- as.numeric(unlist(strsplit(params[params$indicator == "stoch",2],",")))
n1 <- n[1]
n2 <- n[2]
n3 <- n[3]

sto <- stoch(HLC(price), nFastK=n1 , nFastD=n2 , nSlowD=n2 , bounded = TRUE, smooth=n3)

price2 <- cbind(price,sto)
price2$signal <- price2$fastK > price2$fastD

tail(price2) %>% kbl(row.names = FALSE) %>% kable_styling("hover", full_width = F)
date high low close fastK fastD slowD signal
2022-09-21 0.0611722 0.0588482 0.0591937 0.0568522 0.1840955 0.2789364 FALSE
2022-09-22 0.0603352 0.0588364 0.0602601 0.2338066 0.1842312 0.2414693 TRUE
2022-09-23 0.0611151 0.0593600 0.0604473 0.2765888 0.1564572 0.2075474 TRUE
2022-09-24 0.0608608 0.0596805 0.0598714 0.2051294 0.1664459 0.1925710 TRUE
2022-09-25 0.0602690 0.0595288 0.0597274 0.2381482 0.1783978 0.1802876 TRUE
2022-09-26 0.0598475 0.0593026 0.0594387 0.1609932 0.1952531 0.1774801 FALSE
today_signal <- price2[nrow(price2),"signal"]
previous_signal <- price2[(nrow(price2)-1),"signal"]
if (today_signal != previous_signal ) {
  if ( (today_signal == TRUE ) & (previous_signal == FALSE ) ) {
    trx_signal="BUY"
  }
  if ( (today_signal == FALSE ) & (previous_signal == TRUE ) ) {
    trx_signal="SELL"
  }
} else {
  trx_signal <- "NONE"
}

if (today_signal==TRUE) {
  ens_stoch=TRUE
} else {
  ens_stoch=FALSE
}

message(paste("TRX stoch signal:",trx_signal))
## TRX stoch signal: SELL
par(mfrow=c(2,1))
plot(price2$close ~ as.Date(price2$date),type="l",log="y",
  xlab="Date",ylab="price (USD)",main="USD price")
grid()

plot(price2$fastK ~ as.Date(price2$date),type="l",col="blue",
  xlab="Date",ylab="index",main="stochastic oscillator")
lines(as.Date(price2$date), price2$fastD  , col="red"  )
grid()

par(mfrow=c(1,1))
if ( trx_signal != "NONE") {
  MYNOTE <- paste(MYNOTE,"TRX Stoch signal is", trx_signal,".")
}

TRX double RSI indicator

Double RSI is simply two RSI lines.

n <- as.numeric(unlist(strsplit(params[params$indicator == "RSI2",2],",")))
n1 <- n[1]
n2 <- n[2]

rsi1 <- RSI(price$close,n=n1,maType=EMA)
rsi2 <- RSI(price$close,n=n2,maType=EMA)

price2 <- cbind(price,rsi1,rsi2)
price2$signal <- price2$rsi1 > price2$rsi2

tail(price2) %>% kbl(row.names = FALSE) %>% kable_styling("hover", full_width = F)
date high low close rsi1 rsi2 signal
2022-09-21 0.0611722 0.0588482 0.0591937 9.593744 35.10000 FALSE
2022-09-22 0.0603352 0.0588364 0.0602601 56.699900 41.33580 TRUE
2022-09-23 0.0611151 0.0593600 0.0604473 62.428831 42.39598 TRUE
2022-09-24 0.0608608 0.0596805 0.0598714 37.197872 39.97198 FALSE
2022-09-25 0.0602690 0.0595288 0.0597274 31.836774 39.35827 FALSE
2022-09-26 0.0598475 0.0593026 0.0594387 21.488374 38.07957 FALSE
today_signal <- price2[nrow(price2),"signal"]
previous_signal <- price2[(nrow(price2)-1),"signal"]
if (today_signal != previous_signal ) {
  if ( (today_signal == TRUE ) & (previous_signal == FALSE ) ) {
    trx_signal="BUY"
  }
  if ( (today_signal == FALSE ) & (previous_signal == TRUE ) ) {
    trx_signal="SELL"
  }
} else {
  trx_signal <- "NONE"
}

if (today_signal==TRUE) {
  ens_RSI2=TRUE
} else {
  ens_RSI2=FALSE
}

message(paste("TRX RSI signal:",trx_signal))
## TRX RSI signal: NONE
par(mfrow=c(2,1))
plot(price2$close ~ as.Date(price2$date),type="l",log="y",
  xlab="Date",ylab="price (USD)",main="USD price")
grid()

plot(price2$rsi1 ~ as.Date(price2$date),type="l",col="blue",
  xlab="Date",ylab="index",main="double RSI")
lines(as.Date(price2$date), price2$rsi2  , col="red"  )
grid()

par(mfrow=c(2,1))
plot(price2$close ~ as.Date(price2$date),type="l",log="y",
  xlab="Date",ylab="price (USD)",main="USD price")
grid()

plot(price2$rsi1/price2$rsi2 ~ as.Date(price2$date),type="l",
  xlab="Date",ylab="RSI ratio",main="double RSI")
grid()
abline(h=1,lty=2,lwd=2)

par(mfrow=c(1,1))
if ( trx_signal != "NONE") {
  MYNOTE <- paste(MYNOTE,"TRX RSI2 signal is", trx_signal,".")
}

TRX Donchian channel indicator

n <- as.numeric(params[params$indicator == "DC",2])

price2 <- price[1:nrow(price)-1,]
dc <- DonchianChannel(price2$close,n=n)

price2$higher <- c(NA,sapply(2:nrow(dc),function(i) {
  dc[i,"high"] > dc[(i-1),"high"]
} ))
price2$lower <- c(NA,sapply(2:nrow(dc),function(i) {
  dc[i,"low"] < dc[(i-1),"low"]
} ))
price2 <- price2[price2$higher != price2$lower,]
# show changing rows only
price2 <- price2[c(NA,unlist(lapply(2:nrow(price2) , function(i) {
  price2$higher[i] != price2$higher[i-1]
}))),]
price2 <- price2[!is.na(price2$higher),]

previous_signal <- price2[nrow(price2),"higher"]

price2 <- price
dc <- DonchianChannel(price2$close,n=n)
colnames(dc) <- c("dchigh","dcmid","dclow")
price2 <- cbind(price2,dc)

tail(price2) %>% kbl(row.names = FALSE) %>%  kable_styling("hover", full_width = F)
date high low close dchigh dcmid dclow
2022-09-21 0.0611722 0.0588482 0.0591937 0.0603353 0.0597645 0.0591937
2022-09-22 0.0603352 0.0588364 0.0602601 0.0602601 0.0597269 0.0591937
2022-09-23 0.0611151 0.0593600 0.0604473 0.0604473 0.0598205 0.0591937
2022-09-24 0.0608608 0.0596805 0.0598714 0.0604473 0.0601594 0.0598714
2022-09-25 0.0602690 0.0595288 0.0597274 0.0604473 0.0600874 0.0597274
2022-09-26 0.0598475 0.0593026 0.0594387 0.0598714 0.0596551 0.0594387
trx_signal="NONE"

# if we in negative territory, check whether time to buy
if ( previous_signal == FALSE ) {
  if ( price2[nrow(price2),"dchigh"] > price2[nrow(price2)-1,"dchigh"] ) {
    trx_signal="BUY"
  }
}

# if we in positive territory, check whether time to sell
if ( previous_signal == TRUE ) {
  if ( price2[nrow(price2),"dclow"] < price2[nrow(price2)-1,"dclow"] ) {
    trx_signal="SELL"
  }
}

if ( trx_signal=="NONE" ) {
  today_signal=previous_signal
} else {
  if (trx_signal=="BUY") { today_signal = TRUE }
  if (trx_signal=="SELL") { today_signal = FALSE }
}

if (today_signal==TRUE) {
  ens_DC=TRUE
} else {
  ens_DC=FALSE
}

message(paste("TRX DC signal:",trx_signal))
## TRX DC signal: NONE
plot(price2$close ~ as.Date(price2$date),type="l",log="y",
  xlab="Date",ylab="price (USD)",main="USD price",lwd=2)
grid()

lines(price2$dclow~ as.Date(price2$date),lwd=1.5,col="red")
lines(price2$dchigh~ as.Date(price2$date),lwd=1.5,col="limegreen")

price2 <- tail(price2,100)

plot(price2$close ~ as.Date(price2$date),type="l",log="y",
  xlab="Date",ylab="price (USD)",main="USD price",lwd=2)
grid()

lines(price2$dclow~ as.Date(price2$date),lwd=1.5,col="red")
lines(price2$dcmid~ as.Date(price2$date),lwd=1.5,col="gray")
lines(price2$dchigh~ as.Date(price2$date),lwd=1.5,col="limegreen")

if ( trx_signal != "NONE") {
  MYNOTE <- paste(MYNOTE,"TRX Donchian channel signal is", trx_signal,".")
}

TRX Ensemble indicator

This is a combination of a number of indicators.

ens <- params[params$indicator=="Ensemble","parameter"]
myrev <- intToUtf8(rev(utf8ToInt(ens)))
myrev <- unlist(strsplit(myrev,","))
# get thresh
n <- as.numeric(myrev[1])
myrev <- myrev[2:length(myrev)]
# get combination
combo <- sapply(myrev,function(s) { intToUtf8(rev(utf8ToInt(s))) })

message(paste("The combination is",paste(combo,collapse=" ")))
## The combination is stoch TSI SMAcross
message(paste("The buy threshold is",n))
## The buy threshold is 3
indicators <- c("SMA"=ens_SMA,
  "EMA"=ens_EMA,
  "SMAcross"=ens_SMAcross,
  "EMAcross"=ens_EMAcross,
  "DMI"=ens_DMI,
  "TSI"=ens_TSI,
  "stoch"=ens_stoch,
  "RSI2"=ens_RSI2,
  "DC"=ens_DC)

indicators <- indicators[names(indicators) %in% combo]
message("State of the indicators:")
## State of the indicators:
indicators
## SMAcross      TSI    stoch 
##    FALSE    FALSE    FALSE
today_count <- sum(indicators)
message(paste("today_count_TRX",today_count,sep="="))
## today_count_TRX=0
today_signal <- today_count>=n

prev_html <- readLines("https://mdz-analytics.com/coins/TRX/alerts_TRX.html")
prev_signal <- length(grep("TRX ensemble indicator is BULLISH",prev_html))>2

trx_signal <- "NONE"

if ( today_signal != prev_signal ) {
  if ( today_signal == TRUE ) {
    trx_signal="BUY"
  } else {
    trx_signal="SELL"
  }
}

if (today_signal==TRUE) {
  message("TRX ensemble indicator is BULLISH")
} else {
  message("TRX ensemble indicator is BEARISH")
}
## TRX ensemble indicator is BEARISH
message(paste("TRX ENS signal:",trx_signal))
## TRX ENS signal: NONE
if ( trx_signal != "NONE") {
  MYNOTE <- paste(MYNOTE,"TRX Ensemble indicator is", trx_signal,".")
}

Send a push notification.

MYNOTE
## [1] " TRX Stoch signal is SELL ."
if ( !is.null(MYNOTE) ) {
  MYNOTE <- paste(MYNOTE, ". Visit https://mdz-analytics.com/coins/TRX/alerts_TRX.html for the details")
  MYNOTE
  pbPost("note", "Crypto Alert", MYNOTE ,channel="trx_signal")
}

Session information

For reproducibility


Click HERE to show session info

sessionInfo()
## R version 4.1.2 (2021-11-01)
## Platform: aarch64-unknown-linux-gnu (64-bit)
## Running under: Ubuntu 22.04.1 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/aarch64-linux-gnu/blas/libblas.so.3.10.0
## LAPACK: /usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3.10.0
## 
## locale:
##  [1] LC_CTYPE=en_AU.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=en_AU.UTF-8        LC_COLLATE=en_AU.UTF-8    
##  [5] LC_MONETARY=en_AU.UTF-8    LC_MESSAGES=en_AU.UTF-8   
##  [7] LC_PAPER=en_AU.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=en_AU.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] kableExtra_1.3.4  RPushbullet_0.3.4 quantmod_0.4.20   TTR_0.24.3       
##  [5] xts_0.12.1        zoo_1.8-10        runner_0.4.1      forcats_0.5.1    
##  [9] stringr_1.4.0     dplyr_1.0.9       purrr_0.3.4       readr_2.1.2      
## [13] tidyr_1.2.0       tibble_3.1.8      ggplot2_3.3.6     tidyverse_1.3.2  
## [17] jsonlite_1.8.0   
## 
## loaded via a namespace (and not attached):
##  [1] httr_1.4.4          sass_0.4.2          viridisLite_0.4.0  
##  [4] modelr_0.1.8        bslib_0.4.0         assertthat_0.2.1   
##  [7] highr_0.9           googlesheets4_1.0.1 cellranger_1.1.0   
## [10] yaml_2.3.5          pillar_1.8.0        backports_1.4.1    
## [13] lattice_0.20-45     glue_1.6.2          digest_0.6.29      
## [16] rvest_1.0.2         colorspace_2.0-3    htmltools_0.5.3    
## [19] pkgconfig_2.0.3     broom_1.0.0         haven_2.5.0        
## [22] bookdown_0.28       scales_1.2.0        webshot_0.5.3      
## [25] svglite_2.1.0       tzdb_0.3.0          googledrive_2.0.0  
## [28] generics_0.1.3      ellipsis_0.3.2      cachem_1.0.6       
## [31] withr_2.5.0         cli_3.3.0           magrittr_2.0.3     
## [34] crayon_1.5.1        readxl_1.4.1        evaluate_0.16      
## [37] fs_1.5.2            fansi_1.0.3         xml2_1.3.3         
## [40] tools_4.1.2         hms_1.1.1           gargle_1.2.0       
## [43] lifecycle_1.0.1     munsell_0.5.0       reprex_2.0.2       
## [46] compiler_4.1.2      jquerylib_0.1.4     systemfonts_1.0.4  
## [49] rlang_1.0.4         grid_4.1.2          rstudioapi_0.13    
## [52] rmarkdown_2.15      gtable_0.3.0        DBI_1.1.3          
## [55] curl_4.3.2          R6_2.5.1            lubridate_1.8.0    
## [58] knitr_1.39          fastmap_1.1.0       utf8_1.2.2         
## [61] stringi_1.7.8       parallel_4.1.2      rmdformats_1.0.4   
## [64] Rcpp_1.0.9          vctrs_0.4.1         dbplyr_2.2.1       
## [67] tidyselect_1.1.2    xfun_0.32